// 定义主题特质 `Subject`，规定了请求的方法。
trait Subject {
    fn request(&self) -> String; // 请求方法返回一个字符串
}

// 具体主题 `RealSubject` 结构体，实现了 `Subject` 特质。
struct RealSubject;

// 实现 `Subject` 特质的 `request()` 方法，处理真实请求。
impl Subject for RealSubject {
    fn request(&self) -> String {
        "RealSubject: Handling request.".to_string() // 处理真实请求的具体逻辑
    }
}

// 代理 `Proxy` 结构体，包含一个真实主题 `RealSubject` 对象。
struct Proxy {
    real_subject: RealSubject, // 代理持有一个真实主题的实例
}

// `Proxy` 结构体的实现
impl Proxy {
    // 构造函数 `new()`，初始化代理并传入真实主题 `RealSubject` 对象。
    fn new(real_subject: RealSubject) -> Self {
        Self { real_subject }
    }
}

// `Proxy` 结构体也实现了 `Subject` 特质，重写了 `request()` 方法。
impl Subject for Proxy {
    fn request(&self) -> String {
        format!(
            "Proxy: Checking access prior to firing a real request.\n{}",
            self.real_subject.request() // 在调用真实主题前进行访问控制或其他处理
        )
    }
}

// 主函数入口 `main()`，演示代理模式的使用。
pub fn main() {
    let real_subject = RealSubject; // 创建真实主题对象
    let proxy = Proxy::new(real_subject); // 创建代理对象，传入真实主题对象
    println!("{}", proxy.request()); // 调用代理对象的请求方法，输出代理处理结果
}
